package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import dominio.PersistentObject;
import dominio.Producto;

public class ProductoDAO extends DataAccessObject {

	@Override
	public void delete(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Producto p = (Producto) obj;
			conn = getConnection();
			String sql = "DELETE FROM Producto WHERE Id = ?";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, p.getId());
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new ObjectNotFoundException("No se encontro el Producto a eliminar");
			commitTransaction();			
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
			}
			catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
			}
		}
	}

	@Override
	public void insert(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Producto p = (Producto) obj;
			int id=DataAccessObject.proximoOid();
			conn = getConnection();
			String sql = "INSERT INTO Producto (Id,Nombre,Costo,PrecioVenta,TiempoProduccion) VALUES(?,?,?,?,?)";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, id);
			pst.setString(2, p.getNombre());
			pst.setDouble(3, p.getCostoUnidad());
			pst.setDouble(4, p.getPrecioVenta());
			pst.setInt(5, p.getTiempoProduccion());
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new ObjectNotFoundException("No se pudo insertar el Producto");
			commitTransaction();			
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
			}
			catch(SQLException sqex) {}
		}
	}

	@Override
	public List<Object> selectAll() throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Producto";
			pst = conn.createStatement();
			
			rs = pst.executeQuery(sql);
			
			
			List<Object> productos = new ArrayList<Object>();
			Producto p = null;
			while(rs.next()) {
				p= leerDesdeResultSet(rs);
				productos.add(p);
			}
			
			return productos;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				if(!conn.isClosed())conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {
			//throw new PersistentException(sqex.getMessage());
			}
		}
	}
	@Override
	public void update(PersistentObject obj) throws PersistentException {
		Connection conn = null;
		PreparedStatement pst = null;
		try {
			Producto p = (Producto) obj;
			conn = getConnection();
			String sql = "UPDATE Producto SET Nombre=?,Costo=?,PrecioVenta=?,TiempoProduccion=? WHERE Id=?";
			pst = conn.prepareStatement(sql);
			pst.setInt(5, p.getId());
			pst.setString(1, p.getNombre());
			pst.setDouble(2, p.getCostoUnidad());
			pst.setDouble(3, p.getPrecioVenta());
			pst.setInt(4, p.getTiempoProduccion());
			int registro = pst.executeUpdate();
			if(registro == 0)
				throw new PersistentException("No se pudo actualizar el Producto");
			commitTransaction();			
		}
		catch(SQLException sqex) {
			rollBackTransaction();
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				closeConection();
				if(pst != null) pst.close();
			}
			catch(SQLException sqex) {}
		}
	}

	public static Producto buscarPorId(int id) throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Producto WHERE Id ="+id;
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			Producto p = null;
			while(rs.next()) {
				p= leerDesdeResultSet(rs);
			}
			return p;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}

	public static List<Producto> buscarPorNombre(String nombre) throws PersistentException {
		Connection conn = null;
		Statement pst = null;
		ResultSet rs = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(true);
			String sql = "SELECT * FROM Producto WHERE Nombre LIKE '%"+ nombre +"%'";
			pst = conn.createStatement();
			rs = pst.executeQuery(sql);
			List<Producto> listaClientes = new ArrayList<Producto>();
			while(rs.next()) {
				Producto producto= leerDesdeResultSet(rs);
				listaClientes.add(producto);
			}
			return listaClientes;
		}
		catch(SQLException sqex) {
			throw new PersistentException(sqex.getMessage());
		}
		finally {
			try {
				conn.close();
				if(pst != null) pst.close();
				if(rs != null) rs.close();
			}
			catch(SQLException sqex) {}
		}
	}

	private static Producto leerDesdeResultSet(ResultSet rs) throws PersistentException {
		 try {
	            Producto p = new Producto();
	            p.setId(rs.getInt("Id"));
	            p.setNombre(rs.getString("nombre"));
	            p.setCostoUnidad(rs.getDouble("Costo"));
	            p.setPrecioVenta(rs.getDouble("PrecioVenta"));
	            p.setTiempoProduccion(rs.getInt("TiempoProduccion"));
	         
	            return p;
	        } catch (SQLException e) {
	        	throw new PersistentException(e.getMessage());
	        }
	       
	    }

	

}
